
-- {
--     "ProductKey": "k021qfZofse",
--     "DeviceName": "demo_1",
--     "DeviceSecret": "7962ab3c0fa89227665f492a10d4add6"
--   }

-- PROJECT = "lcddemo"
-- VERSION = "1.0.0"

-- log.info("main", PROJECT, VERSION)

-- -- sys库是标配
-- _G.sys = require("sys")

-- require("sysplus")

-- if wdt then
--     wdt.init(9000)--初始化watchdog设置为9s
--     sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
-- end

-- local spi_id,pin_reset,pin_dc,pin_cs,bl = 2,10,6,7,11

-- spi_lcd = spi.deviceSetup(spi_id,pin_cs,0,0,8,20*1000*1000,spi.MSB,1,0)--打开spi
-- port = "device"
-- print('hello2222222222222222')

-- lcd.init("st7735v",{port = port,pin_dc = pin_dc, pin_pwr = bl, pin_rst = pin_reset,direction = 1,w = 160,h = 80,xoffset = 0,yoffset = 24},spi_lcd)
--     --如果显示颜色相反，请解开下面一行的注释，关闭反色
--     --lcd.invoff()
--     --0.96寸TFT如果显示依旧不正常，可以尝试老版本的板子的驱动
--     -- lcd.init("st7735s",{port = port,pin_dc = pin_dc, pin_pwr = bl, pin_rst = pin_reset,direction = 2,w = 160,h = 80,xoffset = 0,yoffset = 0},spi_lcd)

-- -- 不在内置驱动的, 看demo/lcd_custom


-- --led  uart init--初始化
-- local LEDA= gpio.setup(12, 0, gpio.PULLUP)
-- local LEDB= gpio.setup(13, 0, gpio.PULLUP)
-- local uartid = 1
-- uart.setup(
--     uartid,--串口id
--     115200,--波特率
--     8,--数据位
--     1--停止位
-- )

-- -- -- 收取数据会触发回调, 这里的"receive" 是固定值
-- -- uart.on(uartid, "receive", function(id, len)
-- --     local s = uart.read(id, len)
-- --     if #s > 0 then -- #s 是取字符串的长度
-- --         if s == "on" then
-- --             LEDA(1)
-- --         elseif s == "off" then
-- --             LEDA(0)
-- --         end
-- --         -- 如果传输二进制/十六进制数据, 部分字符不可见, 不代表没收到
-- --         -- 关于收发hex值,请查阅 https://doc.openluat.com/article/583
-- --         log.info("uart", "receive", id, #s, s)


-- --         -- log.info("uart", "receive", id, #s, s:toHex())
-- --     end
-- --     -- 如使用2024.5.13之前编译的ESP32C3/ESP32S3固件, 恢复下面的代码可以正常工作
-- --     -- if #s == len then
-- --     --     break
-- --     -- end

-- -- end)


-- -- --第一个任务


-- -- -- --第二个任务
-- -- -- sys.taskInit(function()
-- -- --     while true do
-- -- --         log.info("task2","------")
-- -- --         LEDA(1)
-- -- --         LEDB(1)
-- -- --         sys.wait(500) --延时0.5秒，这段时间里可以运行其他代码
-- -- --         LEDA(0)
-- -- --         LEDB(0)
-- -- --         sys.wait(500) --延时0.5秒，这段时间里可以运行其他代码
-- -- --     end
-- -- -- end)

-- -- sys.taskInit(function()
-- --     while true do
-- --         log.info("task1","-----")
-- --         print("system start")
-- --         -- uart.write(1,"data")
-- --         sys.wait(1000) --延时500m秒，这段时间里可以运行其他代码
-- --     end
-- -- end)

-- -- print("system start\n",uart.exist(1))



-- -- 开启缓冲区, 刷屏速度回加快, 但也消耗2倍屏幕分辨率的内存
-- -- lcd.setupBuff()          -- 使用lua内存
-- -- -- lcd.setupBuff(nil, true) -- 使用sys内存, 只需要选一种
-- -- lcd.autoFlush(false)
-- -- lcd.flush()
-- lcd.clear()

-- -- sys.taskInit(function()--屏幕显示任务

-- --     while 1 do
-- --         lcd.clear()


-- --         lcd.setFont(lcd.font_opposansm12)
-- --         lcd.drawStr(40,10,"drawStr")
-- --         -- sys.wait(2000)

-- --         lcd.setFont(lcd.font_sarasa_m14_chinese)-- 具体取值可参考api文档的常量表
-- --         lcd.drawStr(40,40,"drawStr测试")

-- --         lcd.flush()
-- --         sys.wait(10)

-- --     end
-- -- end)



-- sys.subscribe("IP_READY", function(ip)
--     log.info("wlan", "ip ready", ip)
--     -- 联网成功, 可以发起http, mqtt, 等请求了
-- end)

-- sys.subscribe("SC_RESULT", function(ssid, password)
--     log.info("why", ssid, password)
-- end)

-- fskv.kvdb_init()

-- sys.taskInit(function()
--     sys.wait(500) -- 这里等500ms只是方便看日志,非必须

--     wlan.init() -- 初始化wifi协议栈

--     -- 获取上次保存的配网信息, 如果存在就直接联网, 不需要配网了
--     -- 注意, fskv保存的数据是掉电存储的, 刷脚本/刷固件也不会清除
--     -- 如需完全清除配置信息, 可调用 fskv.clear() 全清
--     if fskv.kv_get("wlan_ssid") then
--        wlan.connect(fskv.kv_get("wlan_ssid"), fskv.kv_get("wlan_passwd"))
--        return -- 等联网就行了
--     end
--     lcd.setFont(lcd.font_sarasa_m14_chinese)
--     lcd.drawStr(0,12,"无存储wifi，开始配网")
--     -- sys.wait(2000)

--     -- 以下是smartconfig之 esptouch 配网
--     -- 配网APP请搜索 esptouch , 当前最新版2.3.0
--     -- 配网时选用 esptouch, 虽然esptouch V2也是支持的,但 esptouch兼容性比较好
--     -- ESP32C3仅支持2.4G的wifi, 5G wifi是不支持的
--     -- 配网时, 手机应靠近模块, 以便更快配网成功
--     while 1 do
--         -- 启动配网, 默认是esptouch模式,这里改成AIRKISS
--         log.info("wlan", "启动airkiss")
--         lcd.setFont(lcd.font_sarasa_m14_chinese)
--         lcd.drawStr(0,24,"----ing")

--         wlan.smartconfig(wlan.AIRKISS)
--         local ret, ssid, passwd = sys.waitUntil("SC_RESULT", 180*1000) -- 等3分钟

--         if ret == false then
--             log.info("smartconfig", "timeout")
--             wlan.smartconfig(wlan.STOP)
--             sys.wait(3000) -- 再等3s重新配网, 或者直接reboot也行
--         else
--             -- 获取配网后, ssid和passwd会有值
--             log.info("smartconfig", ssid, passwd)
--             -- 获取IP成功, 将配网信息存入fskv, 做持久化存储
--             log.info("fskv", "save ssid and passwd")
--             -- fskv.kv_set("wlan_ssid", ssid)
--             -- fskv.kv_set("wlan_passwd", passwd)

--             -- 这里建议重启, 当然这也不是强制的
--             -- log.info("wifi", "wait 3s to reboot")
--             -- sys.wait(3000)
--             -- 重启后有配网信息, 所以就自动连接
--             --rtos.reboot()
--             break
--         end
--     end
-- end)




-- -- 用户代码已结束---------------------------------------------
-- -- 结尾总是这一句
-- sys.run()
-- -- sys.run()之后后面不要加任何语句!!!!!

















-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "wifidemo"
VERSION = "1.0.0"

-- 引入必要的库文件(lua编写), 内部库不需要require
sys = require("sys")
require("sysplus")

-- -- wifi扫描成功后, 会有WLAN_SCAN_DONE消息, 读取即可
-- sys.subscribe("WLAN_SCAN_DONE", function ()
--     local results = wlan.scanResult()
--     log.info("scan", "results", #results)
--     for k,v in pairs(results) do
--         log.info("scan", v["ssid"], v["rssi"], (v["bssid"]:toHex()))
--     end
-- end)


-- sys.taskInit(function()
--     sys.wait(1000)
--     wlan.init()
--     while 1 do
--         wlan.scan()
--         sys.wait(30000) -- 注意, 尤其是Air780系列, 这个时间只能更长不能短
--     end
-- end)
if wdt then
    --添加硬狗防止程序卡死，在支持的设备上启用这个功能
    wdt.init(9000)--初始化watchdog设置为9s
    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
end
fskv.kvdb_init()


sys.subscribe("IP_READY", function(ip) -- 联网成功的订阅
    log.info("wlan", "ip ready", ip)
    log.info("wlan——hello")
    -- 联网成功, 可以发起http, mqtt, 等请求了
end)
-- sys.subscribe("IP_ERROR", function() -- 联网失败的订阅
--     log.info("联网失败 ")
-- end)



sys.taskInit(function()
    sys.wait(2000)
    wlan.init()
    sys.wait(1000)

    -- 获取上次保存的配网信息, 如果存在就直接联网, 不需要配网了
    -- 注意, fskv保存的数据是掉电存储的, 刷脚本/刷固件也不会清除
    -- 如需完全清除配置信息, 可调用 fskv.clear() 全清
    if fskv.kv_get("wlan_ssid") then
        wlan.connect(fskv.kv_get("wlan_ssid"), fskv.kv_get("wlan_passwd"))
        log.info( "fskv有联网数据")
        log.info( "正在连接请稍等******")
        --可能连接不成功，如果连接超时了（要有一个定时器计时），就让定时器打开"start_smartconfig" 。

        return -- 等联网就行了
    else
        log.info( "fskv中没有联网数据")
        sys.publish("start_smartconfig")
    end

    -- wlan.connect("linsen66", "66668888")
    -- log.info("wlan", "wait for IP_READY")
    -- sys.waitUntil("IP_READY", 30000)
    -- if wlan.ready() then
    --     log.info("wlan", "ready !!")
    --     sys.wait(100)
    -- else
    --     print("wlan NOT ready!!!!")
    -- end


    while 1 do

        sys.waitUntil("start_smartconfig")
        -- 启动配网, 默认是esptouch模式     wlan.smartconfig(wlan.AIRKISS) 是AIRKISS 模式
        wlan.smartconfig(wlan.AIRKISS)
        log.info( "打开esptouch模式 的smartconfig")

        local ret, ssid, passwd = sys.waitUntil("SC_RESULT", 3*60*1000) -- 等3分钟
        if ret == false then
            log.info("timeout stop smartconfig")
            wlan.smartconfig(wlan.STOP)
            -- sys.wait(3000) -- 再等3s重新配网, 或者直接reboot也行
        else
            -- 获取配网后, ssid和passwd会有值
            log.info("获取到的账号和密码 ", ssid, passwd)
            -- 获取IP成功, 将配网信息存入fskv, 做持久化存储
            log.info("fskv", "save ssid and passwd")
            fskv.kv_set("wlan_ssid", ssid)
            fskv.kv_set("wlan_passwd", passwd)

        end

        sys.wait(1000)
    end
end)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
